/*
 *******************************************************************************
 * Copyright (c) 2020, STMicroelectronics
 * All rights reserved.
 *
 * This software component is licensed by ST under BSD 3-Clause license,
 * the "License"; You may not use this file except in compliance with the
 * License. You may obtain a copy of the License at:
 *                        opensource.org/licenses/BSD-3-Clause
 *
 *******************************************************************************
 */
#pragma once

/*----------------------------------------------------------------------------
 *        STM32 pins number
 *----------------------------------------------------------------------------*/
#define PA0                     PIN_A0
#define PA1                     PIN_A1
#define PA2                     PIN_A2
#define PA3                     PIN_A3
#define PA4                     PIN_A4
#define PA5                     PIN_A5
#define PA6                     PIN_A6
#define PA7                     PIN_A7
#define PA8                     8
#define PA9                     9
#define PA10                    10
#define PA11                    11
#define PA12                    12
#define PA13                    13
#define PA14                    14
#define PA15                    15
#define PB0                     PIN_A8
#define PB1                     PIN_A9
#define PB2                     18
#define PB3                     19
#define PB4                     20
#define PB5                     21
#define PB6                     22
#define PB7                     23
#define PB8                     24
#define PB9                     25
#define PB10                    26
#define PB11                    27
#define PB12                    28
#define PB13                    29
#define PB14                    30
#define PB15                    31
#define PC13                    32
#define PC14                    33
#define PC15                    34
#define PD0                     35
#define PD1                     36

// Pin Aliases

#define IO1                     PA10
#define GPIO1                   PA10
#define GP1                     PA10

#define IO2                     PA9
#define GPIO2                   PA9
#define GP2                     PA9

#define IO3                     PA8
#define GPIO3                   PA8
#define GP3                     PA8

#define IO4                     PB15
#define GPIO4                   PB15
#define GP4                     PB15

#define IO5                     PB14
#define GPIO5                   PB14
#define GP5                     PB14

#define IO6                     PB13
#define GPIO6                   PB13
#define GP6                     PB13

#define IO7                     PB12
#define GPIO7                   PB12
#define GP7                     PB12

#define AIO8                    PA7
#define IO8                     PA7
#define GPIO8                   PA7
#define GP8                     PA7

#define AIO9                    PA6
#define IO9                     PA6
#define GPIO9                   PA6
#define GP9 PA6

#define AIO10                   PA5
#define IO10                    PA5
#define GPIO10                  PA5
#define GP10                    PA5

#define IO11                    PB11
#define GPIO11                  PB11
#define GP11                    PB11

#define IO12                    PB10
#define GPIO12                  PB10
#define GP12                    PB10

#define AIO13                   PB1
#define IO13                    PB1
#define GPIO13                  PB1
#define GP13                    PB1

#define AIO14                   PA4
#define IO14                    PA4
#define GPIO14                  PA4
#define GP14                    PA4

#define AIO15                   PA3
#define IO15                    PA3
#define GPIO15                  PA3
#define GP15                    PA3

#define AIO16                   PA2
#define IO16                    PA2
#define GPIO16                  PA2
#define GP16                    PA2

#define AIO17                   PA1
#define IO17                    PA1
#define GPIO17                  PA1
#define GP17                    PA1

#define AIO18                   PA0
#define IO18                    PA0
#define GPIO18                  PA0
#define GP18                    PA0

#define WIFI_EN                 PB8
#define WIFI                    PB8
#define WIFI_RX                 PB7
#define WIFI_TX                 PB6
#define WIFI_BOOT               PB9
#define WIFI_BOOT_EN            PB9
#define WIFI_BOOT_UART          PB0
#define WIFI_BOOT_UART_EN       PB0

#define MICROSD                 PB2
#define MICROSD_EN              PB2
#define MICROSD_MOSI            PB5
#define MICROSD_CLOCK           PB3
#define MICROSD_CLK             PB3
#define MICROSD_MISO            PB4



// Alternate pins number
#define PA0_ALT1                (PA0  | ALT1)
#define PA1_ALT1                (PA1  | ALT1)
#define PA2_ALT1                (PA2  | ALT1)
#define PA3_ALT1                (PA3  | ALT1)
#define PA4_ALT1                (PA4  | ALT1)
#define PA5_ALT1                (PA5  | ALT1)
#define PA6_ALT1                (PA6  | ALT1)
#define PA7_ALT1                (PA7  | ALT1)
#define PA8_ALT1                (PA8  | ALT1)
#define PA9_ALT1                (PA9  | ALT1)
#define PA10_ALT1               (PA10 | ALT1)
#define PA11_ALT1               (PA11 | ALT1)
#define PA15_ALT1               (PA15 | ALT1)
#define PB0_ALT1                (PB0  | ALT1)
#define PB0_ALT2                (PB0  | ALT2)
#define PB1_ALT1                (PB1  | ALT1)
#define PB1_ALT2                (PB1  | ALT2)
#define PB3_ALT1                (PB3  | ALT1)
#define PB10_ALT1               (PB10 | ALT1)
#define PB11_ALT1               (PB11 | ALT1)
#define PB13_ALT1               (PB13 | ALT1)
#define PB14_ALT1               (PB14 | ALT1)

#define NUM_DIGITAL_PINS        37
#define NUM_ANALOG_INPUTS       10

// On-board LED pin number
#ifndef LED_BUILTIN
  #define LED_BUILTIN           PNUM_NOT_DEFINED
#endif

// On-board user button
#ifndef USER_BTN
  #define USER_BTN              PNUM_NOT_DEFINED
#endif

// SPI definitions
#ifndef PIN_SPI_SS
  #define PIN_SPI_SS            PA4
#endif
#ifndef PIN_SPI_SS1
  #define PIN_SPI_SS1           PA15
#endif
#ifndef PIN_SPI_SS2
  #define PIN_SPI_SS2           PNUM_NOT_DEFINED
#endif
#ifndef PIN_SPI_SS3
  #define PIN_SPI_SS3           PNUM_NOT_DEFINED
#endif
#ifndef PIN_SPI_MOSI
  #define PIN_SPI_MOSI          PA7
#endif
#ifndef PIN_SPI_MISO
  #define PIN_SPI_MISO          PA6
#endif
#ifndef PIN_SPI_SCK
  #define PIN_SPI_SCK           PA5
#endif

// I2C definitions
#ifndef PIN_WIRE_SDA
  #define PIN_WIRE_SDA          PB7
#endif
#ifndef PIN_WIRE_SCL
  #define PIN_WIRE_SCL          PB6
#endif

// Timer Definitions
// Use TIM6/TIM7 when possible as servo and tone don't need GPIO output pin
#ifndef TIMER_TONE
  #define TIMER_TONE            TIM3
#endif
#ifndef TIMER_SERVO
  #define TIMER_SERVO           TIM4
#endif

// UART Definitions
#ifndef SERIAL_UART_INSTANCE
  #define SERIAL_UART_INSTANCE  2
#endif

// Default pin used for generic 'Serial' instance
// Mandatory for Firmata
#ifndef PIN_SERIAL_RX
  #define PIN_SERIAL_RX         PA3
#endif
#ifndef PIN_SERIAL_TX
  #define PIN_SERIAL_TX         PA2
#endif

#define HSE_VALUE    16000000U // HSE - External Oscillator Frequency in hertz (16MHZ)

/*----------------------------------------------------------------------------
 *        Arduino objects - C++ only
 *----------------------------------------------------------------------------*/

#ifdef __cplusplus
  // These serial port names are intended to allow libraries and architecture-neutral
  // sketches to automatically default to the correct port name for a particular type
  // of use.  For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN,
  // the first hardware serial port whose RX/TX pins are not dedicated to another use.
  //
  // SERIAL_PORT_MONITOR        Port which normally prints to the Arduino Serial Monitor
  //
  // SERIAL_PORT_USBVIRTUAL     Port which is USB virtual serial
  //
  // SERIAL_PORT_LINUXBRIDGE    Port which connects to a Linux system via Bridge library
  //
  // SERIAL_PORT_HARDWARE       Hardware serial port, physical RX & TX pins.
  //
  // SERIAL_PORT_HARDWARE_OPEN  Hardware serial ports which are open for use.  Their RX & TX
  //                            pins are NOT connected to anything by default.
  #ifndef SERIAL_PORT_MONITOR
    #define SERIAL_PORT_MONITOR   Serial
  #endif
  #ifndef SERIAL_PORT_HARDWARE
    #define SERIAL_PORT_HARDWARE  Serial
  #endif
#endif
